001 /**
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: Apr 27, 2003
005 * Time: 5:48:17 PM
006 */
007
008 package EVolve.util.phasedetectors.phasedetectorUI;
009
010 import EVolve.util.phasedetectors.*;
011 import EVolve.Scene;
012 import EVolve.visualization.*;
013 import EVolve.visualization.XYViz.XYVisualization;
014 import javax.swing.*;
015 import java.awt.event.*;
016 import java.awt.*;
017 import java.util.*;
018
019 public class PhaseDetectorToolBar extends JToolBar{
020 public static int NumberOfSharedOptions = 3;
021 private JButton buttonRefresh, buttonClose, buttonUndo;
022 private JButton buttonAddPhase, buttonRemovePhase;
023 private JButton buttonCopyPhase, buttonPastePhase;
024 private JComboBox comboOptions;
025
026 private JButton buttonTrigger;
027 private JLabel labelNoise;
028 private JTextField noiseTolerance;
029 private int noiseToler = 2;
030
031 private HashMap controlsMap;
032 private PhaseDetector detector;
033 private String detectorName, addRemover, entityTrigger;
034 private Component commonControls[];
035
036
037 public PhaseDetectorToolBar() {
038 super("Phase detector setting");
039 controlsMap = new HashMap();
040 addRemover = "Phase Add/Remove";
041 entityTrigger = "Phase Entity Trigger";
042 detector = null;
043 setPreferredSize(new java.awt.Dimension(800,28));
044 FlowLayout layout = new FlowLayout(FlowLayout.LEFT,2,-2);
045 layout.preferredLayoutSize(this);
046 setLayout(layout);
047 commonControls = createCommandButtons();
048 createPhaseDetectorToolBar();
049 layout.layoutContainer(this);
050 }
051
052 private void createPhaseDetectorToolBar() {
053 setRollover(true);
054
055 comboOptions = new JComboBox();
056
057 controlsMap.put(addRemover,createAddRemoverButtons());
058 controlsMap.put(entityTrigger, createEntityTriggerButtons());
059 comboOptions.addItem(addRemover);
060 comboOptions.addItem(entityTrigger);
061
062 comboOptions.addActionListener(new ActionListener() {
063 public void actionPerformed(ActionEvent e) {
064 String item = (String)comboOptions.getSelectedItem();
065 int number = getComponents().length;
066 for (int i=number-1; i>=2; i--) {
067 remove(i);
068 }
069 Component[] controls = (Component[])controlsMap.get(item);
070 for (int i=0; i<controls.length; i++) {
071 add(controls[i]);
072 }
073 for (int i=0; i<commonControls.length; i++) {
074 add(commonControls[i]);
075 }
076 }
077 });
078 comboOptions.setPreferredSize(new java.awt.Dimension(180,26));
079 add(comboOptions);
080 addSeparator();
081 comboOptions.setSelectedIndex(0);
082 }
083
084 public void refresh() {
085 ArrayList vizList = Scene.getVisualizationManager().getVisualizationList();
086 for (int i=0; i<vizList.size(); i++) {
087 Visualization visual = (Visualization)vizList.get(i);
088 if (visual.isFreezed()) return;
089 }
090
091 if (detector != null)
092 updateToolBarState(detector.getToolBarState());
093
094 Visualization visual = Scene.getVisualizationManager().getActiveVisualization();
095 if ((visual == null) || (!(visual instanceof XYVisualization))) {
096 detector = null;
097 } else
098 detector = ((XYVisualization)visual).getPhaseDetector();
099
100 controlsMap.remove(detectorName);
101
102 comboOptions.removeAllItems();
103 if (detector != null) {
104 detectorName = detector.getName();
105 controlsMap.put(detectorName,detector.createDetectorParamsControls());
106 comboOptions.addItem(detectorName);
107 } else {
108 detectorName = "";
109 }
110
111 comboOptions.addItem(addRemover);
112 comboOptions.addItem(entityTrigger);
113
114 if (detector != null) { //restore button/controls state
115 PhaseDetectorToolBarState state = detector.getToolBarState();
116 comboOptions.setSelectedIndex(state.selectedOption);
117 HashMap optionControlsMap = state.optionsControlState;
118 Iterator it = controlsMap.keySet().iterator();
119 while (it.hasNext()) {
120 String key = (String)it.next();
121 if ((key.equals(detectorName)) || (!optionControlsMap.containsKey(key))) continue;
122
123 Component[] controls = (Component[])controlsMap.get(key);
124 boolean[] enableStates = (boolean[])optionControlsMap.get(key);
125 for (int i=0; i<controls.length; i++) {
126 controls[i].setEnabled(enableStates[i]);
127 }
128 }
129 }
130
131 enableButton(detector != null);
132 buttonClose.setEnabled(true);
133 }
134
135 public void enableButton(boolean flag) {
136 comboOptions.setEnabled(flag);
137 for (int i=0; i<commonControls.length-1; i++) {
138 commonControls[i].setEnabled(flag);
139 }
140 Iterator it = controlsMap.keySet().iterator();
141 while (it.hasNext()) {
142 Component items[] = (Component[])controlsMap.get(it.next());
143 for (int i=0; i<items.length; i++) {
144 items[i].setEnabled(flag);
145 }
146 }
147 boolean empty = Scene.getVisualizationManager().getPhaseOperation().clipboardIsEmpty();
148 if (buttonPastePhase.isEnabled()) {
149 buttonPastePhase.setEnabled(!empty);
150 }
151 boolean undoable = Scene.getVisualizationManager().getPhaseOperation().undoable();
152 buttonUndo.setEnabled(undoable);
153 }
154
155 public void updateVisualization(boolean cleanup) {
156 Visualization visual = Scene.getVisualizationManager().getActiveVisualization();
157 if ((visual == null) || (!(visual instanceof XYVisualization)))
158 return ;
159
160 AxesPanel canvas = (AxesPanel)((JScrollPane)visual.getPanel()).getViewport().getView();
161 PhaseDetector phaseDetector = ((XYVisualization)visual).getPhaseDetector();
162
163 if (phaseDetector == null) return;
164
165 phaseDetector.saveSetting();
166 if (cleanup) {
167 phaseDetector.reset();
168 canvas.setPhases(null);
169 } else
170 phaseDetector.drawPhase(canvas);
171 canvas.repaint();
172 }
173
174 public void updateToolBarState(PhaseDetectorToolBarState state) {
175 state.selectedOption = comboOptions.getSelectedIndex();
176 HashMap optionControlsMap = state.optionsControlState;
177 Iterator it = controlsMap.keySet().iterator();
178 while (it.hasNext()) {
179 String key = (String)it.next();
180 if (key.equals(detectorName)) continue;
181
182 Component[] controls = (Component[])controlsMap.get(key);
183 boolean[] enableStates = null;
184 if (optionControlsMap.containsKey(key)) {
185 enableStates = (boolean[])optionControlsMap.get(key);
186 } else {
187 enableStates = new boolean[controls.length];
188 optionControlsMap.put(key,enableStates);
189 }
190 for (int i=0; i<controls.length; i++) {
191 enableStates[i] = controls[i].isEnabled();
192 }
193 }
194 }
195
196 private Component[] createEntityTriggerButtons() {
197 Component[] returnVal = new Component[3];
198
199 buttonTrigger = new JButton(new ImageIcon(Scene.getGifURL("trigger.gif")));
200 buttonTrigger.setToolTipText("Trigger phases with selected entities");
201 buttonTrigger.addActionListener(new ActionListener() {
202 public void actionPerformed(ActionEvent e) {
203 try {
204 noiseToler = Integer.parseInt(noiseTolerance.getText());
205 Scene.getVisualizationManager().getPhaseOperation().triggerPhases(noiseToler);
206 } catch (NumberFormatException exp) {
207 Scene.showErrorMessage("Noise Tolerance must be an integer!");
208 }
209 }
210 });
211 buttonTrigger.setPreferredSize(new java.awt.Dimension(28,28));
212
213 labelNoise = new JLabel("Noise tolerance (intervals):");
214 noiseTolerance = new JTextField(String.valueOf(noiseToler));
215 noiseTolerance.setColumns(2);
216
217
218 returnVal[0] = labelNoise;
219 returnVal[1] = noiseTolerance;
220 returnVal[2] = buttonTrigger;
221 return returnVal;
222 }
223
224 private Component[] createAddRemoverButtons() {
225 Component returnVal[] = new Component[2];
226
227 buttonAddPhase = new JButton(new ImageIcon(Scene.getGifURL("add.gif")));
228 buttonAddPhase.setToolTipText("Add phase manually");
229 buttonAddPhase.addActionListener(new ActionListener() {
230 public void actionPerformed(ActionEvent e) {
231 Scene.getVisualizationManager().getPhaseOperation().add();
232 }
233 });
234 buttonAddPhase.setPreferredSize(new java.awt.Dimension(28,28));
235
236 buttonRemovePhase = new JButton(new ImageIcon(Scene.getGifURL("remove.gif")));
237 buttonRemovePhase.setToolTipText("Remove phase manually");
238 buttonRemovePhase.addActionListener(new ActionListener() {
239 public void actionPerformed(ActionEvent e) {
240 Scene.getVisualizationManager().getPhaseOperation().remove();
241 }
242 });
243 buttonRemovePhase.setPreferredSize(new java.awt.Dimension(28,28));
244
245 returnVal[0] = buttonAddPhase;
246 returnVal[1] = buttonRemovePhase;
247
248 return returnVal;
249 }
250
251 private Component[] createCommandButtons() {
252 Component returnVal[] = new Component[5];
253
254 buttonClose = new JButton(new ImageIcon(Scene.getGifURL("close.gif")));
255 buttonClose.setToolTipText("Disable Phase Detector");
256 buttonClose.addActionListener(new ActionListener() {
257 public void actionPerformed(ActionEvent e) {
258 Scene.getVisualizationManager().enablePhaseDetector(false);
259 setVisible(false);
260 updateVisualization(true);
261 Scene.getUIManager().refreshToolBar();
262 }
263 });
264 buttonClose.setPreferredSize(new java.awt.Dimension(28,28));
265
266 buttonRefresh = new JButton(new ImageIcon(Scene.getGifURL("refresh.gif")));
267 buttonRefresh.setToolTipText("Refresh Phase Information");
268 buttonRefresh.addActionListener(new ActionListener() {
269 public void actionPerformed(ActionEvent e) {
270 buttonUndo.setEnabled(Scene.getVisualizationManager().getPhaseOperation().undoable());
271 updateVisualization(false);
272 }
273 });
274 buttonRefresh.setPreferredSize(new java.awt.Dimension(28,28));
275
276 buttonCopyPhase = new JButton(new ImageIcon(Scene.getGifURL("copy.gif")));
277 buttonCopyPhase.setToolTipText("Copy phase in the current visualization");
278 buttonCopyPhase.addActionListener(new ActionListener() {
279 public void actionPerformed(ActionEvent e) {
280 Scene.getVisualizationManager().getPhaseOperation().copyPhase();
281 boolean empty = Scene.getVisualizationManager().getPhaseOperation().clipboardIsEmpty();
282 buttonPastePhase.setEnabled(!empty);
283 }
284 });
285 buttonCopyPhase.setPreferredSize(new java.awt.Dimension(28,28));
286
287 buttonPastePhase = new JButton(new ImageIcon(Scene.getGifURL("paste.gif")));
288 buttonPastePhase.setToolTipText("Paste phase to the current visualization");
289 buttonPastePhase.addActionListener(new ActionListener() {
290 public void actionPerformed(ActionEvent e) {
291 Scene.getVisualizationManager().getPhaseOperation().pastePhase();
292 }
293 });
294 buttonPastePhase.setPreferredSize(new java.awt.Dimension(28,28));
295 buttonPastePhase.setEnabled(false);
296
297 buttonUndo = new JButton(new ImageIcon(Scene.getGifURL("undo.gif")));
298 buttonUndo.setToolTipText("Undo");
299 buttonUndo.addActionListener(new ActionListener() {
300 public void actionPerformed(ActionEvent e) {
301 Scene.getVisualizationManager().getPhaseOperation().undo();
302 buttonUndo.setEnabled(Scene.getVisualizationManager().getPhaseOperation().undoable());
303 }
304 });
305 buttonUndo.setPreferredSize(new java.awt.Dimension(28,28));
306 buttonUndo.setEnabled(false);
307
308 returnVal[0] = buttonCopyPhase;
309 returnVal[1] = buttonPastePhase;
310 returnVal[2] = buttonUndo;
311 returnVal[3] = buttonRefresh;
312 returnVal[4] = buttonClose;
313
314 return returnVal;
315 }
316
317 }